package com.snopy.leetcode.index1_1000.index301_400;


import java.util.Arrays;

/**
 * @author snopy
 * @version 1.0.0
 * @classname Question396
 * @description 旋转函数 middle
 * 给定一个长度为 n 的整数数组nums。
 *
 * 假设arrk是数组nums顺时针旋转 k 个位置后的数组，我们定义nums的 旋转函数F为：
 *
 * F(k) = 0 * arrk[0] + 1 * arrk[1] + ... + (n - 1) * arrk[n - 1]
 * 返回F(0), F(1), ..., F(n-1)中的最大值。
 *
 * 生成的测试用例让答案符合32 位 整数。
 *
 * 示例 1:
 *
 * 输入: nums = [4,3,2,6]
 * 输出: 26
 * 解释:
 * F(0) = (0 * 4) + (1 * 3) + (2 * 2) + (3 * 6) = 0 + 3 + 4 + 18 = 25
 * F(1) = (0 * 6) + (1 * 4) + (2 * 3) + (3 * 2) = 0 + 4 + 6 + 6 = 16
 * F(2) = (0 * 2) + (1 * 6) + (2 * 4) + (3 * 3) = 0 + 6 + 8 + 9 = 23
 * F(3) = (0 * 3) + (1 * 2) + (2 * 6) + (3 * 4) = 0 + 2 + 12 + 12 = 26
 * 所以 F(0), F(1), F(2), F(3) 中的最大值是 F(3) = 26 。
 * 示例 2:
 *
 * 输入: nums = [100]
 * 输出: 0
 *
 *
 * @email 77912204@qq.com
 * @date 2022/04/22 21:00
 */
public class Question396 {
    public static void main(String[] args) {
        int[] nums = new int[]{4,3,2,6};
        int max = maxRotateFunction(nums);
        System.out.println(max);
    }
    /**
     * @Description
     * numSum = sum(nums)
     * 对于F(0) = 0*nums[0]+1*nums[1]+2*nums[2]+...+(n-1)*nums[n-1]
     *    F(1) = 1*nums[0]+2*nums[1]+3+nums[2]+...+0*nums[n-1]
     *         = 1*nums[0]+1*nums[1]+1*nums[1]+2*nums[2]+1*nums[2]+...+0*nums[n-1]
     *         = numSum+F(0)-(n-1)*nums[n-1]-nums[n-1]
     *         = numSum+F(0) -n*nums[n-1]
     *    F(k) = numSum + F(k-1) - n*nums[n-k]
     * @param nums:
     * @return: int
     * @Date 2022-04-22
     * @Author txl77912204@gmail.com
     **/
    public static int maxRotateFunction(int[] nums) {
        int len = nums.length,f = 0,numSum = Arrays.stream(nums).sum();
        for (int j = 0; j < len; j++) {
            f+=nums[j]*j;
        }
        int max = f;
        for(int i = 1;i<len;i++){
            f = numSum + f -len*nums[len-i];
            max = Math.max(max,f);
        }
        return max;
    }
}
